from sqlalchemy import create_engine, text, MetaData, Table, Column, String, Integer, DateTime, event
from sqlalchemy.orm import sessionmaker
import pymysql

pymysql.install_as_MySQLdb()


class DatabaseUtils:
    def __init__(self, db_url):
        """
        初始化数据库连接
        :param db_url: 数据库连接URL
        """
        self.engine = create_engine(db_url,
                        pool_size=10,  # 连接池大小，即空闲连接数
                        max_overflow=5,  # 最大溢出数量，即当连接池中的连接都被使用时，可以额外创建的连接数
                        pool_recycle=3600  # 连接的最大生命周期（秒），例如这里设置为1小时
        )
        self.Session = sessionmaker(bind=self.engine)
        self.metadata = MetaData()

    def init_tables(self):
        """
        初始化数据库表
        """
        # 创建 message 表
        message_table = Table(
            'message', self.metadata,
            Column('id', Integer, primary_key=True),
            Column('create_time', String(200)),
            Column('user_name', String(200)),
            Column('content', String(200))
        )


        # 创建表
        self.metadata.create_all(self.engine)
        print("Tables created successfully.")
        # 关闭session和释放引擎资源（如果需要的话）
        self.Session().close()
        # 关闭所有的数据库连接，并且释放所有的资源。在这之后，这个Engine对象就不能再用于执行数据库操作了。
        self.engine.dispose()



    def create_database(self):
        with self.engine.connect() as connection:
            connection.execute(text("CREATE DATABASE IF NOT EXISTS weixin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"))
        print("Database 'weixin' created successfully.")
        return "weixin"

    def execute_query(self, query):
        """
        执行查询语句
        :param query: 查询语句
        :return: 查询结果
        """
        session = self.Session()
        result = session.execute(text(query)).fetchall()
        session.close()
        return result

    def execute_update(self, query):
        """
        执行更新语句
        :param query: 更新语句
        :return: 受影响的行数
        """
        session = self.Session()
        result = session.execute(text(query))
        session.commit()
        session.close()
        return result.rowcount

    def execute_insert(self, query):
        """
        执行插入语句
        :param query: 插入语句
        :return: 插入后的主键值
        """
        session = self.Session()
        result = session.execute(text(query))
        session.commit()
        inserted_id = result.lastrowid
        session.close()
        return inserted_id

    def execute_bulk_insert(self, table_name, columns, rows):
        # 假设你已经有了engine和Session
        session = self.Session()

        # 获取表的元数据
        metadata = MetaData()
        # 确定列类型
        col_types = [String] * len(columns)
        if rows and isinstance(rows[0], dict):
            # 如果rows的第一个元素是字典，且其值是字符串，则使用String类型
            col_types = [String if isinstance(rows[0][col], str) else Integer for col in columns]

            # 反射表（如果表已经存在）
        metadata.reflect(bind=self.engine)

        # 获取表对象
        table = metadata.tables[table_name]

        # 构造批量插入的SQL语句
        # 注意：这里我们直接传递rows，它应该是一个字典列表
        insert_stmt = table.insert().values(rows)

        # 执行批量插入
        result = session.execute(insert_stmt)
        session.commit()
        session.close()

        # 返回受影响的行数
        return result.rowcount


        pass

if __name__ == "__main__":
    db = DatabaseUtils('mysql://root:123456@124.70.50.228:3306/weixin')
    columns = ['config_key', 'config_value']
    rows = [
        {'config_key': 'key1', 'config_value': 'value1'},
        {'config_key': 'key2', 'config_value': 'value2'},
        # ... 更多行数据
    ]
    print(db.execute_bulk_insert('sys_config', columns, rows))
    configparser = {    "url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3e3e-4e4e-5e5e-6e6e",  "token": "123456",  "corpID": "ww195f7d1dc767e06a",  "EncodingAESKey": "wyDT7gGffweqXmV4PxHSg6sC-4kMdsLR8-vZZ0GgBj8"}
